const blogTypeDao = require("../dao/blogTypeDao");
const { ForbiddenError, ValidationError } = require("../utils/errors");
const { filterObjProp } = require("../utils/tools");
const { validate } = require("validate.js");

// 添加一个分类
exports.addOneBlogType = async (dataObj) => {
    // 创建验证规则
    const rule = {
        name: {
            type: "string",
            presence: {
                allowEmpty: false,
            }
        },
        order: {
            type: "string",
            presence: {
                allowEmpty: false
            }
        }
    }
    // 进行验证，如若不通过则抛出异常
    const result = validate(dataObj, rule);
    if (result) {
        throw new ValidationError("数据验证失败");
    }

    // 添加一个默认值
    dataObj.articleCount = 0;

    // 添加数据成功会返回对应的数据。
    const data = await blogTypeDao.addOneData(dataObj);
    return data.dataValues
}

// 获取所有分类
exports.getAllBlogType = async () => {
    let data = await blogTypeDao.findAll();

    // 进入此if证明有数据，根据order字段进行排序
    if (data.length) {
        data = data.map(item => item.dataValues);
        return data.sort((a, b) => a.order - b.order);
    }

    return data;
}

// 获取一个分类
exports.getOneBlogType = async (id) => {
    const data = await blogTypeDao.findOne(id);
    if (data && data.dataValues) {
        return data.dataValues;
    }
    return data;
}

// 删除一个分类
exports.deleteOnBlogType = async (id) => {

    try {
        const { dataValues } = await blogTypeDao.findOne(id);
        await blogTypeDao.deleteOnData(id);
        return dataValues.articleCount;
    } catch (error) {
        console.log(error);
        return 0;
    }
    
    // const result = await blogTypeDao.deleteOnData(id);
    // if (result) {
    //     const { dataValues } = await blogTypeDao.findOne(id);
    //     return dataValues.articleCount;
    // }
    // return result;
}

// 修改一个分类
exports.changeOneBlogType = async (newObj, id) => {
    // 修改，会返回受影响的行数，不需要所以不进行接收
    await blogTypeDao.updateOnData(newObj, id);

    // 重新获取此条数据
    const data = await blogTypeDao.findOne(id);
    return data.dataValues;
}